#include "dri_iic.h"
#include "dri_systick.h"

//SCL PB6 时钟
//SDA PB7 数据
void dri_iic_init(void)
{
	GPIO_InitTypeDef  GPIO_InitStruct;
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_OUT;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;
	GPIO_InitStruct.GPIO_OType=GPIO_OType_OD;
	GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_NOPULL;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStruct);
	
}
void dri_iic_in(void)
{
	GPIO_InitTypeDef  GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_7;
	GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_NOPULL;
	GPIO_Init(GPIOB, &GPIO_InitStruct);
	
}
void dri_iic_out(void)
{
	GPIO_InitTypeDef  GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_OUT;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_7;
	GPIO_InitStruct.GPIO_OType=GPIO_OType_OD;
	GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_NOPULL;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStruct);
	
}
void dri_iic_start(void)
{
	SCL_L;
	dri_iic_out();
	SDA_H;
	SCL_H;
	dri_systick_us(5);
	SDA_L;
	dri_systick_us(5);
	SCL_L;
}
void dri_iic_stop(void)
{
	SCL_L;
	dri_iic_out();
	SDA_L;
	SCL_H;
	dri_systick_us(5);
	SDA_H;
	dri_systick_us(5);
}
void dri_icc_sendACK(void)
{
	SCL_L;
	dri_iic_out();
	SDA_L;
	SCL_H;
	dri_systick_us(5);
	SCL_L;
	
}
void dri_iic_sendNoACK(void)
{
	SCL_L;
	dri_iic_out();
	SDA_H;
	SCL_H;
	dri_systick_us(5);
	SDA_L;
	
}
uint8_t dri_icc_waitACK(void)
{
	uint16_t tim_out=0;
	SCL_L;
	dri_iic_in();
	SCL_H;
	while(READ_SDA)
	{
		tim_out++;
		if(tim_out>500)
		{
			dri_iic_stop();
			return NoACK;
		}
	}
	SCL_L;
	return ACK;
	
}
void dri_iic_senddata(uint8_t data)
{
	uint8_t i=0;
	SCL_L;
	dri_iic_out();
	for(i=0;i<8;i++)
	{
		if(data&0x80)
		{
			SDA_H;
		}
		else
		{
			SDA_L;		
		}
		SCL_H;
		dri_systick_us(2);
		SCL_L;
		dri_systick_us(2);
		data=data<<1;
	}
	
}
uint8_t dri_iic_readdata(uint8_t flg_ack)
{
	uint8_t read_data=0;
	uint8_t i=0;
	SCL_L;
	dri_iic_in();
	for(i=0;i<8;i++)
	{
		read_data=read_data<<1;
		SCL_H;
		if(READ_SDA)
		{
			read_data=read_data=0x01;
		}
		dri_systick_us(2);
		SCL_L;
		dri_systick_us(2);
	}
	if(flg_ack==ACK)
	{
		dri_icc_sendACK();
	}
	else
	{
		dri_iic_sendNoACK();
	}
	return read_data;
}
